package top.kaoshanji.p2ch15b;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * 代码清单-p2ch15b-451页a：简单协作示例
 * author kaoshanji
 * ^_^
 * create time 2025/2/24 10:22
 */
public class WaitThread extends Thread {

    private static final Logger logger = LogManager.getLogger(WaitThread.class);

    // 协作的共享变量
    private volatile boolean fire = false;

    @Override
    public void run() {
        try {
            synchronized (this) { // this 表示当前对象
                while (!fire) { // 需要再次判断条件是否满足
                    wait(); // fire=false，条件不满足时进来，此时释放锁，让其他线程获得锁进而修改共享变量
                }
                System.out.println("满足条件并且获得锁了");
            }
        } catch (InterruptedException e) {
            /// ///
        }
    }

    // 持有锁，修改共享变量使得条件满足，在执行完之后才会释放锁
    public synchronized void fire() { // 实例方法属于对象
        this.fire = true;

        System.out.println("修改fire=true");

        notify(); // 唤醒等待条件队列里面的线程
    }

    public static void main(String[] args) throws InterruptedException {
        logger.info("...start...");

        // 子线程被阻塞了
        WaitThread waitThread = new WaitThread();
        waitThread.start();

        logger.info("...sleep...");

        Thread.sleep(1000);
        System.out.println("fire");

        // 这是一个普通方法
        // 主线程修改条件
        waitThread.fire();
        logger.info("...end...");
    }

}
